package br.org.acessobrasil.portal.persistencia;

import java.net.URLDecoder;
import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;



import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.Gerenciador;
import br.org.acessobrasil.portal.modelo.Pagina;

public class PaginaDaoSpring extends SuperDao<Pagina>{
	private static Logger logger = Logger.getLogger(PaginaDaoSpring.class); 
	@SuppressWarnings("unchecked")
	public List<Pagina> list(long nu_sitio) {
		Query q = getEntityManager().createQuery("Select p From Pagina p where p.nu_sitio=? order by p.no_titulo");
		q.setParameter(1, nu_sitio);
		return q.getResultList();
	}

	
	@SuppressWarnings("unchecked")
	
	public List<Pagina> list() {
		return getEntityManager().createQuery("Select p From Pagina p order by p.no_titulo").getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Pagina> list(long nu_sitio, String tituloFiltro) {
		Query q = getEntityManager().createQuery("Select p From Pagina p where p.nu_sitio=? and p.no_titulo like :titulo order by p.no_titulo");
		q.setParameter(1, nu_sitio);
		q.setParameter("titulo","%" + tituloFiltro + "%");
		return q.getResultList();
	}
	
	public void delete(Pagina pagina) {
		try{
			pagina = select(pagina.getNuPagina());
			getEntityManager().createQuery("update ItemMenu im set im.nu_pagina=0 where im.nu_pagina= :nuPagina")
				.setParameter("nuPagina", pagina.getNuPagina())
				.executeUpdate();
			getEntityManager().remove(pagina);
			Gerenciador.limparCache();
		}catch(Exception e){
			logger.error("erro ao apagar " + pagina,e);
		}
	}

	
	public void create(Pagina pagina) {
		getEntityManager().persist(pagina);
		Gerenciador.limparCache();
	}

	
	public void update(Pagina pagina) {
		getEntityManager().merge(pagina);
		Gerenciador.limparCache();
	}

	@Override
	public Pagina select(Long id) throws Exception {
		return getEntityManager().find(Pagina.class,id);
	}


	@SuppressWarnings("unchecked")
	public List<Pagina> listPorItemMenu(Long nuSitio, Long nuItemMenu) {
		Query q = getEntityManager().createQuery("Select p From Pagina p where p.nu_sitio=? and p.nu_item_menu_secao=? order by p.no_titulo");
		q.setParameter(1, nuSitio);
		q.setParameter(2, nuItemMenu);
		return q.getResultList();
	}


	public Pagina buscarPorUri(String uri) {
		if(uri==null) return null;
		try{
			if(uri.contains("%")){
				uri = URLDecoder.decode(uri,"ISO-8859-1");
			}
			return (Pagina)getEntityManager().createQuery("Select p From Pagina p where p.uri= :uri")
				.setParameter("uri", uri)
				.getSingleResult();
		}catch(NoResultException e){
			//erro esperado, por padrao retornamos null
			return null;
		}catch(Exception e){
			logger.error("Erro inesperado ao buscar por URI '"+uri+"'",e);
			throw new RuntimeException(e.getMessage());
		}
	}

}
